home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / cv_set6 / cv_set6s.lzh / BMP2RGB.S < prev    next >
Text File  |  1997-09-28  |  46KB  |  2,176 lines

  1. *********************************************************************************
  2. *    BMP to RGB converter                <BMP2RGB.X Ver0.01>    *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.     .include    myconst.h
  8.  
  9. WIN3        equ    40
  10. OS2v1        equ    12
  11. OS2v2        equ    64
  12.  
  13. file_header:
  14. f_type:        equ    0        *ファイル識別子 'BM'
  15. f_size:        equ    2        *ファイルのサイズ
  16. f_reserved1:    equ    6        *予備1
  17. f_reserved2:    equ    8        *予備2
  18. f_offbits:    equ    10        *ファイル先頭からイメージデータへのオフセット
  19.  
  20. WIN3_HED:
  21. win3_size:    equ    14        *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
  22. win3_width:    equ    18        *横サイズ
  23. win3_height:    equ    22        *縦サイズ
  24. win3_planes:    equ    26        *使用プレーン数
  25. win3_bitcount:    equ    28        *色数 (1:2色,4:16色,8:256色,24:16777216色)
  26. win3_comp:    equ    30        *圧縮アルゴリズム (0:無圧縮,1:rle8,2:RLE4)
  27. win3_size_image    equ    34        *イメージデータのサイズ
  28. win3_xpels_pm:    equ    38        *X方向のディスプレイ分解能
  29. win3_ypels_pm:    equ    42        *Y方向のディスプレイ分解能
  30. win3_clr_used:    equ    46        *色変換テーブルの大きさ
  31. win3_clr_imp:    equ    50        *重要な色の数
  32.  
  33. OS21_HED:
  34. os21_size:    equ    14        *これ大きさ (12:OS/2 1.x,40:Windows3.x,64:OS/2 2.x)
  35. os21_width:    equ    18        *横サイズ
  36. os21_height:    equ    20        *縦サイズ
  37. os21_planes:    equ    22        *使用プレーン数
  38. os21_bitcount:    equ    24        *色数 (1:2色,4:16色,8:256色,24:16777216色)
  39.  
  40.     .text
  41.     .even
  42.  
  43. start:
  44.     lea.l    mysp(pc),sp        *スタックセット
  45.     lea.l    work(pc),a6
  46.  
  47.     lea.l    16(a0),a0        *余分なメモリ開放
  48.     suba.l    a0,a1
  49.     move.l    a1,-(sp)
  50.     move.l    a0,-(sp)
  51.     DOS    _SETBLOCK
  52.     addq.l    #8,sp
  53.  
  54.     bsr    cmdchk            *コマンドラインの解析
  55.     bsr    s_name_chk        *セーブファイル名のチェック
  56.     bsr    buf_get            *バッファ確保
  57.     bsr    name_get        *ファイル名を取得し処理する
  58.     bsr    buf_free        *バッファ開放
  59.     bsr    exit            *終了処理
  60.     DOS    _EXIT
  61.  
  62. *****************************************************************
  63. *    ファイル名を取得し、ファイルの読み込みを行う        *
  64. *****************************************************************
  65. name_get:
  66.     clr.w    file_cnt(a6)        *ファイル数のカウント初期化
  67.  
  68.     bsr    chkname            *ファイル名に対する前処理
  69.     bsr    chkext            *拡張子が省略されているかチェック
  70.  
  71.     move.w    #ARCHIVE,-(sp)        *最初のファイルを検索する
  72.     pea.l    arg1(a6)        *
  73.     pea.l    filbuf(a6)        *
  74.     DOS    _FILES            *
  75.     lea.l    10(sp),sp        *
  76.  
  77. loop:
  78.     tst.l    d0            *ファイルは見つかったか?
  79.     bmi    done            * 見つからなければ処理完了
  80.  
  81.     bsr    setpath            *得られたファイル名を
  82.                     * フルパスに再構成する
  83.  
  84.     bsr    main            *メイン処理
  85.  
  86.     pea.l    filbuf(a6)        *つぎのファイルを検索する
  87.     DOS    _NFILES            *
  88.     addq.l    #4,sp            *
  89.  
  90.     bra    loop            *繰り返す
  91.  
  92. done:
  93.     bsr    file_cnt_chk        *処理したファイル数のチェック
  94.     rts
  95.  
  96. *****************************************************************
  97. *    files実行に先立ってファイル名に前処理を加える        *
  98. *****************************************************************
  99. chkname:
  100.     pea.l    nambuf(a6)        *ファイル名を展開する
  101.     pea.l    arg1(a6)        *
  102.     DOS    _NAMECK            *
  103.     addq.l    #8,sp            *
  104.  
  105.     tst.l    d0            *d0<0なら
  106.     bmi    name_er            * ファイル名の指定に誤りがある
  107.  
  108.     beq    nowild            *d0=0ならワイルドカード指定なし
  109.  
  110.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  111.     bne    wild            * ワイルドカード指定あり
  112.  
  113. noname:                    *ファイル名が指定されていない場合
  114.     lea.l    arg1(a6),a0        *バッファargに
  115.     lea.l    nambuf(a6),a1        * nameckで展開したパス名+'*.BMP'
  116.     bsr    strcpy            * を再構成する
  117.     lea.l    kome0(pc),a1        *
  118.     bsr    strcpy            *
  119.  
  120. wild:                    *ワイルドカードが指定された場合
  121.                     *何もしなくてよい
  122. cknam0:
  123.     rts
  124.  
  125. nowild:                    *ワイルドカードが指定されていない場合
  126.     move.w    #SUBDIR,-(sp)        *サブディレクトリであると仮定して
  127.     pea.l    arg1(a6)        * 検索してみる
  128.     pea.l    filbuf(a6)        *
  129.     DOS    _FILES            *
  130.     lea.l    10(sp),sp        *
  131.     
  132.     tst.l    d0            *見つかったか?
  133.     bmi    cknam0            * 見つからなければファイルだろう
  134.  
  135.     lea.l    arg1(a6),a0        *バッファarg1に
  136.     lea.l    komekome(pc),a1        * もとのファイル名+'\*.BMP'
  137.     bsr    strcat            * を再構成する
  138.  
  139.     bra    chkname            *nameckでファイル名を展開するために
  140.                     * サブルーチン先頭に戻る
  141.  
  142. *****************************************************************
  143. *    出力パス名をチェックする                *
  144. *****************************************************************
  145. s_name_chk:
  146.     lea.l    arg2(a6),a0        *出力パス名を指定したか?
  147.     tst.b    (a0)
  148.     beq    s_name_chk8        *してない
  149.  
  150.     pea.l    nambuf(a6)        *ファイル名を展開する
  151.     pea.l    arg2(a6)        *
  152.     DOS    _NAMECK            *
  153.     addq.l    #8,sp            *
  154.  
  155.     tst.l    d0            *d0<0なら
  156.     bmi    out_name_err        * パス名の指定に誤りがある
  157.  
  158.     beq    s_name_chk1        *d0=0ならワイルドカード指定なし
  159.  
  160.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  161.     bne    out_name_err        * ワイルドカード指定あり
  162.  
  163. s_name_chk1:
  164.     lea.l    arg2(a6),a0        *ドライブ名を指定しているか?
  165.     cmp.b    #':',1(a0)
  166.     bne    out_name_err        *ドライブ名の指定に誤りがある
  167.  
  168.     tst.b    2(a0)            *ドライブ名のみか
  169.     bne    s_name_chk2        *違う
  170.     addq.l    #2,a0
  171.     bra    s_name_chk9
  172.  
  173. s_name_chk2:
  174.     moveq.l    #0,d0            *セーブ先ドライブ番号を求める
  175.     move.b    (a0),d0
  176.     bsr    toupper
  177.     sub.b    #'A',d0
  178.     add.b    #1,d0
  179.  
  180.     lea.l    spathbuf(a6),a1        *セーブ先ドライブ名
  181.     move.b    (a0),(a1)+
  182.     move.b    #':',(a1)+
  183.     move.b    #'\',(a1)+
  184.  
  185.     move.l    a1,-(sp)        *セーブ先パスをセーブ
  186.     move.w    d0,-(sp)
  187.     DOS    _CURDIR
  188.     addq.l    #6,sp
  189.  
  190.     lea.l    cpathbuf(a6),a2        *カレントパスをセーブしておく
  191.     DOS    _CURDRV
  192.     add.b    #"A",d0
  193.     move.b    d0,(a2)+
  194.     move.b    #':',(a2)+
  195.     move.b    #'\',(a2)+
  196.  
  197.     move.l    a2,-(sp)
  198.     move.w    #0,-(sp)
  199.     DOS    _CURDIR
  200.     addq.l    #6,sp
  201.  
  202.     pea.l    arg2(a6)        *コマンドラインで指定されたパスへ
  203.     DOS    _CHDIR            * 移動してみる
  204.     addq.l    #4,sp
  205.  
  206.     tst.l    d0            *d0が0でなければ
  207.     bmi    out_name_err        * パス名の指定に誤りがある
  208.  
  209.     pea.l    spathbuf(a6)        *セーブ先パスを戻す
  210.     DOS    _CHDIR
  211.     addq.l    #4,sp
  212.  
  213.     pea.l    cpathbuf(a6)        *カレントパスに戻す
  214.     DOS    _CHDIR
  215.     addq.l    #4,sp
  216.  
  217.     lea.l    arg2(a6),a0        *
  218.     bsr    set_en            *パス名の最後に\マークをセット
  219.     bra    s_name_chk9
  220.  
  221. s_name_chk8:
  222.     lea.l    arg2(a6),a0
  223.  
  224. s_name_chk9:
  225.     move.l    a0,nameichi(a6)
  226.     rts
  227.  
  228. *****************************************************************
  229. *    パス名に¥マークを連結する                *
  230. *****************************************************************
  231. set_en:
  232.     tst.b    (a0)+            *(a0)は0か?
  233.     bne    set_en            *そうでなければ繰り返す
  234.     subq.l    #1,a0            *行きすぎたから1つ戻る
  235.  
  236.     cmp.b    #"\",-1(a0)        *一番最後の文字が¥か
  237.     beq    set_en_            * ¥ならばスキップ
  238.     move.b    #'\',(a0)+        * ¥をセット
  239. set_en_:
  240.     rts
  241.  
  242. *****************************************************************
  243. *    files,nfilesで見付けたファイル名をフルパスに構成し直し    *
  244. *        arg1以降に格納する                *
  245. *****************************************************************
  246. setpath:
  247.     lea.l    arg1(a6),a0        *a0=コピー先
  248.     lea.l    nambuf(a6),a1        *a1=nameckで展開したパス名
  249.     bsr    strcpy            *コピーする
  250.     lea.l    filbuf(a6),a1        *a1=files,nfilesで見付けたファイル名
  251.     lea.l    30(a1),a1
  252.     bsr    strcpy            *連結する
  253.     rts
  254.  
  255. *****************************************************************
  256. *    文字列の連結および複写                    *
  257. *    リターン時a0は文字列末の00Hを指す            *
  258. *****************************************************************
  259. strcat:
  260.     tst.b    (a0)+            *(a0)は0か?
  261.     bne    strcat            *そうでなければ繰り返す
  262.     subq.l    #1,a0            *行きすぎたから1つ戻る
  263. strcpy:
  264.     move.b    (a1)+,(a0)+        *1文字ずつ
  265.     bne    strcpy            *終了コードまでを転送する
  266.     subq.l    #1,a0            *a0は進み過ぎている
  267.                     *a0は文字列末の00Hを指す
  268.     rts
  269.  
  270. *****************************************************************
  271. *    拡張子を補う                        *
  272. *****************************************************************
  273. chkext:
  274.     lea.l    arg1(a6),a0        *ファイル名のアドレス
  275.     lea.l    dext(pc),a1        *拡張子のアドレス
  276. chkext0:
  277.     cmp.b    #".",(a0)        *拡張子があるか
  278.     beq    chkext2
  279.     tst.b    (a0)+            *(a0)は0か?
  280.     bne    chkext0            *そうでなければ繰り返す
  281.     subq.l    #1,a0            *行きすぎたから1つ戻る
  282. chkext1:
  283.     move.b    (a1)+,(a0)+        *1文字転送
  284.     bne    chkext1            *終了コードまで繰り返す
  285. chkext2:
  286.     rts
  287.  
  288. *****************************************************************
  289. *    コマンドラインのチェックを行う                *
  290. *****************************************************************
  291. cmdchk:
  292.     lea.l    arg1(a6),a0        *a0=引数切り出し領域
  293.     clr.b    256(a0)            *出力ファイル名をちょっと初期化
  294.     addq.l    #1,a2            *a2=コマンドライン文字列先頭
  295.     sf    nflg(a6)        *NスイッチOFF
  296.     sf    hflg(a6)        *HスイッチOFF
  297.  
  298. cmdchk0:
  299.     bsr    switch_chk        *スイッチのチェック
  300.  
  301.     tst.b    (a2)            *引数があるか?
  302.     beq    usage            *ないならファイル名が足りない
  303.     bsr    getarg            *ファイル名切り出し
  304.     lea.l    256(a0),a0        *a0=a0+256
  305.     bsr    switch_chk        *さらにスイッチのチェック
  306.     bsr    getarg            *ファイル名切り出し
  307.     bsr    switch_chk        *さらにスイッチのチェック
  308.     tst.b    (a2)            *引数があるか?
  309.     bne    usage            * あるなら引数が多い
  310. cmdchk1:
  311.     rts
  312.  
  313. *****************************************************************
  314. *    スペースを飛ばしつぎの引数先頭までポインタを進め    *
  315. *    スイッチがあれば処理してしまう                *
  316. *****************************************************************
  317. switch_chk:
  318.     bsr    skipsp            *スペースをスキップする
  319.     tst.b    (a2)            *まだスイッチがあるか?
  320.     beq    switch_chk2        *ないなら戻る(処理の振り分けを行う)
  321.  
  322.     cmpi.b    #'/',(a2)        *引数の先頭が
  323.     beq    switch_chk1        */,-であれば
  324.     cmpi.b    #'-',(a2)        *  スイッチ
  325.     beq    switch_chk1        *
  326.     bra    switch_chk2        *スイッチでないなら戻る
  327.  
  328. switch_chk1:
  329.     addq.l    #1,a2            *'/'や'-'の分ポインタを進める
  330.     tst.b    (a2)            *スイッチがあるか?
  331.     beq    usage            * ないなら使用方表示
  332.     move.b    (a2)+,d0        *1文字取り出す
  333.     bsr    toupper            *大文字に変換しておく
  334.  
  335.     cmpi.b    #'N',d0
  336.     beq    nsw
  337.     cmpi.b    #'H',d0
  338.     beq    hsw
  339.     bra    usage            *無効なスイッチが指定された
  340.  
  341. nsw:
  342.     tst.b    nflg(a6)
  343.     bne    usage
  344.     st    nflg(a6)
  345.     bra    switch_chk
  346.  
  347. hsw:
  348.     tst.b    hflg(a6)
  349.     bne    usage
  350.     st    hflg(a6)
  351.     bra    switch_chk
  352.  
  353. switch_chk2:
  354.     rts
  355.  
  356. *****************************************************************
  357. *    ファイル名を切り出す                    *
  358. *****************************************************************
  359. getarg:
  360.     move.l    a0,-(sp)        *{レジスタ待避
  361. gtarg0:    tst.b    (a2)            *1)文字列の終端コードか
  362.     beq    gtarg1            *
  363.     cmpi.b    #SPACE,(a2)        *2)スペースか
  364.     beq    gtarg1            *
  365.     cmpi.b    #TAB,(a2)        *3)タブか
  366.     beq    gtarg1            *
  367. *    cmpi.b    #'-',(a2)        *4)ハイフンか
  368. *    beq    gtarg1            *
  369.     cmpi.b    #'/',(a2)        *5)スラッシュ
  370.     beq    gtarg1            *
  371.     move.b    (a2)+,(a0)+        * が現れるまで転送を
  372.     bra    gtarg0            * 繰り返す
  373. gtarg1:    clr.b    (a0)            *文字列終端コードを書き込む
  374.     movea.l    (sp)+,a0        *}レジスタ復帰
  375.     rts
  376.  
  377. *****************************************************************
  378. *    スペース・TABをスキップする                *
  379. *****************************************************************
  380. skipsp0:
  381.     addq.l    #1,a2
  382. skipsp:
  383.     cmpi.b    #$20,(a2)
  384.     beq    skipsp0
  385.     cmpi.b    #$09,(a2)
  386.     beq    skipsp0
  387.     rts
  388.  
  389. *****************************************************************
  390. *    小文字→大文字変換ルーチン                *
  391. *****************************************************************
  392. toupper:
  393.     cmpi.b    #'a',d0
  394.     bcs    toupr0
  395.     cmpi.b    #'z'+1,d0
  396.     bcc    toupr0
  397.     subi.b    #$20,d0
  398. toupr0:
  399.     rts
  400.  
  401. *****************************************************************
  402. *    メイン処理                        *
  403. *****************************************************************
  404. main:
  405.     clr.w    line_cnt(a6)        *ラインカウント初期化
  406.     sf    skip_flg(a6)        *スキップフラグ初期化
  407.     lea.l    arg1(a6),a0        *ファイル名セット
  408.     bsr    file_open        *ファイルオープン
  409.     bsr    file_size        *ファイルサイズを調べる
  410.     move.l    d6,fi_size(a6)
  411.  
  412.     movea.l    buff_addr(a6),a5    *ヘッダを読み込む
  413.     moveq.l    #14+64,d6
  414.     bsr    file_read
  415.  
  416.     bsr    file_chk        *コンバートできるか調べる
  417.     tst.b    skip_flg(a6)
  418.     bne    main9
  419.  
  420.     bsr    line_byte_set        *1ラインのバイト数を調べる
  421.     bsr    mem_chk            *メモリが足りるか調べる
  422.     tst.b    skip_flg(a6)
  423.     bne    main9
  424.  
  425.     bsr    pal_set            *パレットデータ作成
  426.     bsr    convert            *コンバート
  427.  
  428.     addq.w    #1,file_cnt(a6)
  429. main9:
  430.     bsr    file_close1
  431.     rts
  432.  
  433. *****************************************************************
  434. *    ファイルヘッダから画像サイズを求める            *
  435. *****************************************************************
  436. file_chk:
  437.     movea.l    buff_addr(a6),a0    *読み込んだデータの先頭
  438.  
  439.     tst.b    hflg(a6)
  440.     bne    file_chk1
  441.     cmp.w    #'BM',f_type(a0)    *ファイル識別子はあっているか
  442.     beq    file_chk1
  443.     bsr    file_er            *BMPファイルではない
  444.     bra    file_chk9
  445.  
  446. file_chk1:
  447.     move.l    f_offbits(a0),d0    *offbitsセーブ
  448.     bsr    i_to_m
  449.     move.l    d0,offbits(a6)
  450.  
  451. *    move.l    f_size(a0),d0        *ファイルサイズセーブ
  452. *    bsr    i_to_m
  453. *    move.l    d6,fi_size(a6)
  454.  
  455.     move.l    win3_size(a0),d0    *BMPの種類
  456.     bsr    i_to_m
  457.     move.w    d0,os_type(a6)
  458.  
  459.     cmp.w    #OS2v1,d0        *OS/2 1.x
  460.     beq    os21_chk
  461.     cmp.w    #WIN3,d0        *Win 3.x
  462.     beq    win3_chk
  463.     cmp.w    #OS2v2,d0        *OS/2 2.x(Win3チェックで動くと思う)
  464.     beq    win3_chk
  465.     bsr    no_support_err
  466.     bra    file_chk9
  467.  
  468. *****************************************************************
  469. *    OS/2 1.xのサイズを求める                *
  470. *****************************************************************
  471. os21_chk:
  472.     move.w    os21_planes(a0),d0    *使用プレーン数は1か
  473.     ror.w    #8,d0
  474.     cmp.w    #1,d0
  475.     beq    os21_chk0
  476.     bsr    no_support_err
  477.     bra    file_chk9
  478.  
  479. os21_chk0:
  480.     move.w    os21_bitcount(a0),d0    *使用色数GET
  481.     ror.w    #8,d0
  482.     move.w    d0,iro(a6)
  483.  
  484.     cmp.w    #1,d0            *2
  485.     beq    os21_chk1
  486.     cmp.w    #4,d0            *16
  487.     beq    os21_chk1
  488.     cmp.w    #8,d0            *256
  489.     beq    os21_chk1
  490.     cmp.w    #24,d0            *Full
  491.     beq    os21_chk1
  492.     bsr    but_col_err        *それ以外は無視*
  493.     bra    file_chk9
  494.  
  495. os21_chk1:
  496.     move.w    os21_width(a0),d0    *横ドット数求める
  497.     ror.w    #8,d0
  498.     move.w    d0,yoko(a6)
  499.     move.w    os21_height(a0),d0    *縦ドット数求める
  500.     ror.w    #8,d0
  501.     move.w    d0,tate(a6)
  502.  
  503.     cmp.w    #24,iro(a6)
  504.     beq    os21_chk2
  505.  
  506.     move.l    os21_size(a0),d0    *パレット数を求める
  507.     bsr    i_to_m
  508.     move.l    offbits(a6),d1
  509.     sub.l    d0,d1
  510.     sub.l    #14,d1
  511.     divu.w    #3,d1            *おそい
  512.     move.w    d1,pal_cnt(a6)
  513.  
  514.     move.l    a0,a1            *パレットデータのアドレス
  515.     adda.l    d0,a1
  516.     adda.l    #14,a1
  517.     move.l    a1,pal_addr(a6)
  518.  
  519. os21_chk2:
  520.     move.l    buff_addr(a6),gr_addr(a6)    *変換後画像アドレス
  521.     clr.w    compress(a6)
  522.     rts
  523.  
  524. *****************************************************************
  525. *    WIN3.xのサイズを求める                    *
  526. *****************************************************************
  527. win3_chk:
  528.     move.w    win3_planes(a0),d0    *使用プレーン数は1か
  529.     ror.w    #8,d0
  530.     cmp.w    #1,d0
  531.     beq    win3_chk1
  532.     bsr    no_support_err
  533.     bra    file_chk9
  534.  
  535. win3_chk1:
  536.     move.w    win3_bitcount(a0),d0    *使用色数GET
  537.     ror.w    #8,d0
  538.     move.w    d0,iro(a6)
  539.  
  540.     cmp.w    #1,d0            *2
  541.     beq    win3_chk2
  542.     cmp.w    #4,d0            *16
  543.     beq    win3_chk2
  544.     cmp.w    #8,d0            *256
  545.     beq    win3_chk2
  546.     cmp.w    #16,d0            *32k
  547.     beq    win3_chk2
  548.     cmp.w    #24,d0            *Full
  549.     beq    win3_chk2
  550.     bsr    but_col_err        *それ以外は無視*
  551.     bra    file_chk9
  552.  
  553. win3_chk2:
  554.     move.l    win3_comp(a0),d0    *圧縮モード
  555.     bsr    i_to_m
  556.     move.w    d0,compress(a6)
  557.  
  558.     move.l    win3_width(a0),d0    *横ドット数求める
  559.     bsr    i_to_m
  560.     move.w    d0,yoko(a6)
  561.     move.l    win3_height(a0),d0    *縦ドット数求める
  562.     bsr    i_to_m
  563.     move.w    d0,tate(a6)
  564.  
  565.     cmp.w    #24,iro(a6)        *フルカラーの時
  566.     beq    win3_chk3
  567.  
  568.     move.l    win3_size(a0),d0    *パレット数を求める
  569.     bsr    i_to_m
  570.     move.l    offbits(a6),d1
  571.     sub.l    d0,d1
  572.     sub.l    #14,d1
  573.     lsr.l    #2,d1
  574.     move.w    d1,pal_cnt(a6)
  575.  
  576.     movea.l    a0,a1        *パレットの先頭アドレスを求める
  577.     adda.l    d0,a1
  578.     adda.l    #14,a1
  579.     move.l    a1,pal_addr(a6)
  580.  
  581. win3_chk3:
  582.     move.l    buff_addr(a6),gr_addr(a6)    *変換後画像アドレス
  583.     rts
  584.  
  585. file_chk9:                *スキップする画像の時
  586.     bsr    file_close1
  587.     st    skip_flg(a6)
  588.     rts
  589.  
  590. *****************************************************************
  591. *    メモリチェック                        *
  592. *****************************************************************
  593. mem_chk:
  594.     cmp.w    #16,iro(a6)        *16bitBMP
  595.     beq    mem_chk2
  596.  
  597.     tst.w    compress(a6)
  598.     bne    mem_chk1        *rle4 or 8
  599.  
  600. mem_chk0:
  601.     moveq.l    #0,d0            *ベタは最低1ライン
  602.     move.w    line_byte1(a6),d0
  603.     add.w    line_byte2(a6),d0
  604.     bra    mem_chk3
  605.  
  606. mem_chk1:
  607.     move.w    line_byte1(a6),d0    *RLE圧縮はオンメモリ
  608.     add.w    line_byte2(a6),d0
  609.     mulu.w    tate(a6),d0
  610.  
  611.     move.w    line_byte2(a6),d1
  612.     mulu.w    tate(a6),d1
  613.     add.l    fi_size(a6),d1
  614.  
  615.     cmp.l    d0,d1
  616.     bls    mem_chk1_
  617.     move.l    d1,d0
  618. mem_chk1_:
  619.     bra    mem_chk3
  620.  
  621. mem_chk2:
  622.     move.w    line_byte1(a6),d0    *16bitBMPもオンメモリ
  623.     add.w    line_byte2(a6),d0
  624.     mulu.w    tate(a6),d0
  625.     add.l    fi_size(a6),d0
  626.  
  627. mem_chk3:
  628.     cmp.l    buff_size(a6),d0
  629.     bls    mem_chk4
  630.     bsr    no_buff
  631.     bsr    file_close1
  632.     st    skip_flg(a6)
  633. mem_chk4:
  634.     rts
  635.  
  636. i_to_m:
  637.     ror.w    #8,d0
  638.     swap.w    d0
  639.     ror.w    #8,d0
  640.     rts
  641.  
  642. *****************************************************************
  643. *    1ラインのバイト数を求める                *
  644. *****************************************************************
  645. line_byte_set:
  646.     move.w    iro(a6),d0
  647.     cmp.w    #4,d0
  648.     bcs    lb_set1
  649.     beq    lb_set4
  650.  
  651.     cmp.w    #16,d0
  652.     bcs    lb_set8
  653.     beq    lb_set16
  654.     bhi    lb_set24
  655.  
  656. lb_set1:
  657.     move.w    yoko(a6),d0
  658.     add.w    #31,d0
  659.     lsr.w    #3,d0
  660.     and.w    #$fffc,d0
  661.     move.w    d0,line_byte1(a6)
  662.     bra    line_byte_set9
  663.  
  664. lb_set4:
  665.     move.w    yoko(a6),d0
  666.     addq.w    #7,d0
  667.     lsr.w    #1,d0
  668.     and.w    #$fffc,d0
  669.     move.w    d0,line_byte1(a6)
  670.     bra    line_byte_set9
  671.  
  672. lb_set8:
  673.     move.w    yoko(a6),d0
  674.     addq.w    #3,d0
  675.     andi.w    #$fffc,d0
  676.     move.w    d0,line_byte1(a6)
  677.     bra    line_byte_set9
  678.  
  679. lb_set16:
  680.     move.w    yoko(a6),d0
  681.     add.w    d0,d0
  682.     addq.w    #3,d0
  683.     andi.w    #$fffc,d0
  684.     move.w    d0,line_byte1(a6)
  685.     bra    line_byte_set9
  686.  
  687. lb_set24:
  688.     move.w    yoko(a6),d0
  689.     move.w    d0,d1
  690.     add.w    d1,d1
  691.     add.w    d1,d0
  692.     addq.w    #3,d0
  693.     and.w    #$fffc,d0
  694.     move.w    d0,line_byte1(a6)
  695.  
  696. line_byte_set9:
  697.     move.w    yoko(a6),d0
  698.     move.w    d0,d1
  699.     add.w    d1,d1
  700.     add.w    d1,d0
  701.     move.w    d0,line_byte2(a6)
  702.     rts
  703.  
  704. *****************************************************************
  705. *    コンバート                        *
  706. *****************************************************************
  707. convert:
  708.     tst.w    compress(a6)        *圧縮ファイルは展開する
  709.     beq    convert0
  710.     bsr    tenkai
  711.  
  712. convert0:
  713.     bsr    prt0
  714.     bsr    prt1
  715.  
  716.     bsr    save_name_set        *書き込むファイル名作成
  717.     bsr    ipr_set            *IPRファイル作成
  718.     lea.l    arg2(a6),a0        *RGBファイル作成
  719.     bsr    file_create
  720.  
  721.     move.w    line_byte1(a6),d0    *一回に変換できるライン数(d3)を求める
  722.     add.w    line_byte2(a6),d0
  723.     move.l    buff_size(a6),d3
  724.     divu.w    d0,d3
  725.  
  726.     cmp.w    tate(a6),d3        *一回で変換できるか
  727.     bls    convert1        *できない
  728.  
  729.     move.w    tate(a6),d3
  730.     moveq.l    #1,d4
  731.     moveq.l    #0,d5
  732.     bra    convert2
  733.  
  734. convert1:
  735.     moveq.l    #0,d5            *繰り返し数(d4)と残り(d5)を求める
  736.     move.w    tate(a6),d5
  737.     divu.w    d3,d5
  738.     move.w    d5,d4
  739.     swap    d5
  740.  
  741. convert2:
  742.     move.w    line_byte1(a6),d0    *変換先アドレスを求める
  743.     mulu.w    d3,d0
  744.     add.l    buff_addr(a6),d0
  745.     move.l    d0,gr_addr(a6)
  746.  
  747.     bsr    convert4
  748.  
  749.     tst.w    d5            *半端分があるか
  750.     beq    convert3        *ない
  751.     moveq.l    #1,d4            *最後のコンバート
  752.     move.w    d5,d3
  753.     bsr    convert4
  754.  
  755. convert3:
  756.     move.w    out_file(a6),-(sp)    *ファイルCLOSE
  757.     DOS    _CLOSE
  758.     addq.l    #2,sp
  759.     bsr    prt3
  760.     rts
  761.  
  762. convert4:
  763.     subq.w    #1,d4
  764. convert4_:
  765.     tst.w    compress(a6)
  766.     bne    convert5
  767.  
  768.     bsr    get_seek        *シーク位置(d0)求める
  769.     bsr    file_seek
  770.  
  771.     movea.l    buff_addr(a6),a5    *読み込み
  772.     move.w    line_byte1(a6),d6
  773.     mulu.w    d3,d6
  774.     bsr    file_read
  775.  
  776. convert5:
  777.     move.w    d3,d7            *コンバート
  778.     bsr    gr_conv
  779.  
  780.     move.l    gr_addr(a6),a5        *書き込み
  781.     move.w    line_byte2(a6),d6
  782.     mulu.w    d3,d6
  783.     bsr    file_write
  784.  
  785.     dbra.w    d4,convert4_        *繰り返し
  786.     rts
  787.  
  788. get_seek:                *シーク位置(d0)求める
  789.     move.w    tate(a6),d0
  790.     move.w    line_cnt(a6),d1
  791.     add.w    d3,d1
  792.     sub.w    d1,d0
  793.     mulu.w    line_byte1(a6),d0
  794.     add.l    offbits(a6),d0
  795.     rts
  796.  
  797. file_seek:                *指定位置(d0)にシーク
  798.     move.w    #0,-(sp)        *シークモード
  799.     move.l    d0,-(sp)        *オフセット
  800.     move.w    in_file(a6),-(sp)
  801.     DOS    _SEEK
  802.     addq.l    #8,sp
  803.     tst.l    d0
  804.     bmi    read_err
  805.     rts
  806.  
  807. *****************************************************************
  808. *    画像コンバート                        *
  809. *****************************************************************
  810. gr_conv:
  811.     subq.w    #1,d7            *繰り返し数
  812.     move.l    buff_addr(a6),a0    *変換元
  813.     move.w    d7,d0
  814.     mulu.w    line_byte1(a6),d0
  815.     adda.l    d0,a0
  816.     move.l    gr_addr(a6),a2        *変換先
  817.  
  818.     move.w    iro(a6),d0
  819.     cmp.w    #4,d0
  820.     bcs    bit1_conv
  821.     beq    bit4_conv
  822.  
  823.     cmp.w    #16,d0
  824.     bcs    bit8_conv
  825.     beq    bit16_conv
  826.     bhi    bit24_conv
  827.  
  828. *****************************************************************
  829. *    1bit画像をコンバート                    *
  830. *****************************************************************
  831. bit1_conv:
  832.     movem.l    d0-d1/d3-d7/a0-a4,-(sp)
  833.  
  834.     move.w    yoko(a6),d0        *横サイズ
  835.     move.w    d0,d6            *端数を計算
  836.     andi.w    #$0007,d6
  837.  
  838.     lea.l    pal_buf(a6),a3
  839.     movea.w    line_byte1(a6),a4
  840.     moveq.l    #0,d5
  841.  
  842.     lsr.w    #3,d0            *横/8-1
  843.     subq.w    #1,d0
  844. bit1_conv2:
  845.     move.w    d0,d1            *横ループ
  846.     movea.l    a0,a1
  847. bit1_conv3:
  848.     move.b    (a1)+,d3
  849.  
  850.     moveq.l    #0,d4
  851.     add.b    d3,d3
  852.     addx.b    d4,d4
  853.     move.b    d4,d5
  854.     add.b    d5,d5
  855.     add.b    d4,d5
  856.     lea.l    (a3,d5.w),a5
  857.     move.b    (a5)+,(a2)+
  858.     move.b    (a5)+,(a2)+
  859.     move.b    (a5)+,(a2)+
  860.     moveq.l    #0,d4
  861.     add.b    d3,d3
  862.     addx.b    d4,d4
  863.     move.b    d4,d5
  864.     add.b    d5,d5
  865.     add.b    d4,d5
  866.     lea.l    (a3,d5.w),a5
  867.     move.b    (a5)+,(a2)+
  868.     move.b    (a5)+,(a2)+
  869.     move.b    (a5)+,(a2)+
  870.     moveq.l    #0,d4
  871.     add.b    d3,d3
  872.     addx.b    d4,d4
  873.     move.b    d4,d5
  874.     add.b    d5,d5
  875.     add.b    d4,d5
  876.     lea.l    (a3,d5.w),a5
  877.     move.b    (a5)+,(a2)+
  878.     move.b    (a5)+,(a2)+
  879.     move.b    (a5)+,(a2)+
  880.     moveq.l    #0,d4
  881.     add.b    d3,d3
  882.     addx.b    d4,d4
  883.     move.b    d4,d5
  884.     add.b    d5,d5
  885.     add.b    d4,d5
  886.     lea.l    (a3,d5.w),a5
  887.     move.b    (a5)+,(a2)+
  888.     move.b    (a5)+,(a2)+
  889.     move.b    (a5)+,(a2)+
  890.     moveq.l    #0,d4
  891.     add.b    d3,d3
  892.     addx.b    d4,d4
  893.     move.b    d4,d5
  894.     add.b    d5,d5
  895.     add.b    d4,d5
  896.     lea.l    (a3,d5.w),a5
  897.     move.b    (a5)+,(a2)+
  898.     move.b    (a5)+,(a2)+
  899.     move.b    (a5)+,(a2)+
  900.     moveq.l    #0,d4
  901.     add.b    d3,d3
  902.     addx.b    d4,d4
  903.     move.b    d4,d5
  904.     add.b    d5,d5
  905.     add.b    d4,d5
  906.     lea.l    (a3,d5.w),a5
  907.     move.b    (a5)+,(a2)+
  908.     move.b    (a5)+,(a2)+
  909.     move.b    (a5)+,(a2)+
  910.     moveq.l    #0,d4
  911.     add.b    d3,d3
  912.     addx.b    d4,d4
  913.     move.b    d4,d5
  914.     add.b    d5,d5
  915.     add.b    d4,d5
  916.     lea.l    (a3,d5.w),a5
  917.     move.b    (a5)+,(a2)+
  918.     move.b    (a5)+,(a2)+
  919.     move.b    (a5)+,(a2)+
  920.     moveq.l    #0,d4
  921.     add.b    d3,d3
  922.     addx.b    d4,d4
  923.     move.b    d4,d5
  924.     add.b    d5,d5
  925.     add.b    d4,d5
  926.     lea.l    (a3,d5.w),a5
  927.     move.b    (a5)+,(a2)+
  928.     move.b    (a5)+,(a2)+
  929.     move.b    (a5)+,(a2)+
  930.  
  931.     dbra.w    d1,bit1_conv3
  932.  
  933.     move.w    d6,d1            *端数があるか
  934.     beq    bit1_conv5        *ない
  935.     subq.w    #1,d1
  936.     move.b    (a1)+,d3
  937. bit1_conv4:
  938.     moveq.l    #0,d4
  939.     add.b    d3,d3
  940.     addx.b    d4,d4
  941.     move.b    d4,d5
  942.     add.b    d5,d5
  943.     add.b    d4,d5
  944.     lea.l    (a3,d5.w),a5
  945.     move.b    (a5)+,(a2)+
  946.     move.b    (a5)+,(a2)+
  947.     move.b    (a5)+,(a2)+
  948.     dbra.w    d1,bit1_conv4
  949.  
  950. bit1_conv5:
  951.     bsr    prt2            *変換ライン数表示
  952.     suba.l    a4,a0            *変換元アドレス更新
  953.     dbra.w    d7,bit1_conv2
  954.     movem.l    (sp)+,d0-d1/d3-d7/a0-a4
  955.     rts
  956.  
  957. *****************************************************************
  958. *    4bit画像をコンバート                    *
  959. *****************************************************************
  960. bit4_conv:
  961.     movem.l    d0-d5/d7/a0-a5,-(sp)
  962.  
  963.     lea.l    pal_buf(a6),a3
  964.     movea.w    line_byte1(a6),a4
  965.     move.w    #$000f,d4
  966.  
  967.     move.w    yoko(a6),d0
  968.     btst.l    #0,d0            *横ドットが奇数か?
  969.     bne    bit4_conv4        *そう
  970.  
  971.     lsr.w    #1,d0            *横/2-1
  972.     subq.w    #1,d0
  973. bit4_conv2:                *横ドット=偶数
  974.     move.w    d0,d1
  975.     movea.l    a0,a1
  976. bit4_conv3
  977.     move.b    (a1)+,d2
  978.     move.b    d2,d3
  979.  
  980.     lsr.b    #4,d2            *上位4ビットを変換
  981.     and.w    d4,d2
  982.     move.w    d2,d5
  983.     add.w    d5,d5
  984.     add.w    d2,d5
  985.     lea.l    (a3,d5.w),a5
  986.     move.b    (a5)+,(a2)+
  987.     move.b    (a5)+,(a2)+
  988.     move.b    (a5)+,(a2)+
  989.  
  990.     and.w    d4,d3            *下位4ビットを変換
  991.     move.w    d3,d5
  992.     add.w    d5,d5
  993.     add.w    d3,d5
  994.     lea.l    (a3,d5.w),a5
  995.     move.b    (a5)+,(a2)+
  996.     move.b    (a5)+,(a2)+
  997.     move.b    (a5)+,(a2)+
  998.  
  999.     dbra.w    d1,bit4_conv3
  1000.  
  1001.     bsr    prt2            *変換ライン数表示
  1002.     suba.l    a4,a0
  1003.     dbra.w    d7,bit4_conv2
  1004.     movem.l    (sp)+,d0-d5/d7/a0-a5
  1005.     rts
  1006.  
  1007.  
  1008. bit4_conv4:                *横ドット数=奇数
  1009.     lsr.w    #1,d0            *横/2-1
  1010.     subq.w    #1,d0
  1011. bit4_conv5
  1012.     move.w    d0,d1
  1013.     movea.l    a0,a1
  1014. bit4_conv6
  1015.     move.b    (a1)+,d2
  1016.     move.b    d2,d3
  1017.  
  1018.     lsr.b    #4,d2            *上位4ビットを変換
  1019.     and.w    d4,d2
  1020.     move.w    d2,d5
  1021.     add.w    d5,d5
  1022.     add.w    d2,d5
  1023.     lea.l    (a3,d5.w),a5
  1024.     move.b    (a5)+,(a2)+
  1025.     move.b    (a5)+,(a2)+
  1026.     move.b    (a5)+,(a2)+
  1027.  
  1028.     and.w    d4,d3            *下位4ビットを変換
  1029.     move.w    d3,d5
  1030.     add.w    d5,d5
  1031.     add.w    d3,d5
  1032.     lea.l    (a3,d5.w),a5
  1033.     move.b    (a5)+,(a2)+
  1034.     move.b    (a5)+,(a2)+
  1035.     move.b    (a5)+,(a2)+
  1036.  
  1037.     dbra.w    d1,bit4_conv6
  1038.  
  1039.     move.b    (a1)+,d2        *上位4ビットのみ変換
  1040.     lsr.b    #4,d2
  1041.     and.w    d4,d2
  1042.     move.w    d2,d5
  1043.     add.w    d5,d5
  1044.     add.w    d2,d5
  1045.     lea.l    (a3,d5.w),a5
  1046.     move.b    (a5)+,(a2)+
  1047.     move.b    (a5)+,(a2)+
  1048.     move.b    (a5)+,(a2)+
  1049.  
  1050.     bsr    prt2            *変換ライン数表示
  1051.     suba.l    a4,a0
  1052.     dbra.w    d7,bit4_conv5
  1053.     movem.l    (sp)+,d0-d5/d7/a0-a5
  1054.     rts
  1055.  
  1056. *****************************************************************
  1057. *    8bit画像をコンバート                    *
  1058. *****************************************************************
  1059. bit8_conv:
  1060.     movem.l    d0-d2/d5-d7/a0-a5,-(sp)
  1061.     lea.l    pal_buf(a6),a3
  1062.     move.w    line_byte1(a6),a4
  1063.     move.w    yoko(a6),d5
  1064.     subq.w    #1,d5
  1065. bit8_conv1:
  1066.     movea.l    a0,a1
  1067.     move.w    d5,d6
  1068. bit8_conv2:
  1069.     moveq.l    #0,d1
  1070.     move.b    (a1)+,d1
  1071.     move.w    d1,d2
  1072.     add.w    d1,d1
  1073.     add.w    d2,d1
  1074.     lea.l    (a3,d1.w),a5
  1075.     move.b    (a5)+,(a2)+
  1076.     move.b    (a5)+,(a2)+
  1077.     move.b    (a5)+,(a2)+
  1078.     dbra.w    d6,bit8_conv2
  1079.  
  1080.     bsr    prt2            *変換ライン数表示
  1081.     suba.l    a4,a0
  1082.     dbra.w    d7,bit8_conv1
  1083.     movem.l    (sp)+,d0-d2/d5-d7/a0-a5
  1084.     rts
  1085.  
  1086. *****************************************************************
  1087. *    16bit画像をコンバート                    *
  1088. *****************************************************************
  1089. bit16_conv:
  1090.     bsr    irohen16        *変換
  1091.     tst.b    nflg(a6)
  1092.     beq    bit16_conv9
  1093.     bsr    hanten            *画像の上下反転
  1094. bit16_conv9:
  1095.     rts
  1096.  
  1097. irohen16:
  1098.     movem.l    d0-d7/a0-a4,-(sp)
  1099.  
  1100.     move.w    #%0000_0000_0111_1100,d4
  1101.     move.w    #%1110_0000_0000_0011,d5
  1102.     move.w    #%0001_1111_0000_0000,d6
  1103.  
  1104.     move.w    yoko(a6),d0
  1105.     subq.w    #1,d0
  1106.     subq.w    #1,d1
  1107.     movea.w    d0,a3
  1108.     movea.w    line_byte1(a6),a4
  1109.  
  1110. irohen16_1:
  1111.     move.w    a3,d0
  1112.     movea.l    a0,a1
  1113. irohen16_2:
  1114.     move.w    (a1)+,d1
  1115.     move.w    d1,d2
  1116.     move.w    d1,d3
  1117.     and.w    d4,d1            *R
  1118.     and.w    d5,d2            *G
  1119.     and.w    d6,d3            *B
  1120.  
  1121.     rol.w    #1,d1
  1122.     rol.w    #6,d2
  1123.     ror.w    #5,d3
  1124.  
  1125.     move.b    d1,(a2)+
  1126.     move.b    d2,(a2)+
  1127.     move.b    d3,(a2)+
  1128.     dbra.w    d0,irohen16_2
  1129.  
  1130.     bsr    prt2            *変換ライン数表示
  1131.     suba.l    a4,a0
  1132.     dbra.w    d7,irohen16_1
  1133.     movem.l    (sp)+,d0-d7/a0-a4
  1134.     rts
  1135.  
  1136.  
  1137. hanten:
  1138.     movem.l    d0-d4/a0-a3,-(sp)
  1139.  
  1140.     movea.l    a2,a0            *転送元1
  1141.  
  1142.     move.w    tate(a6),d0        *転送元2 (tate-1)*yoko*3
  1143.     subq.w    #1,d0
  1144.     move.w    yoko(a6),d1
  1145.     move.w    d1,d2
  1146.     add.w    d1,d1
  1147.     add.w    d2,d1
  1148.     mulu.w    d1,d0
  1149.     adda.l    d0,a2
  1150.  
  1151.     moveq.l    #0,d1            *1ライン上への差分 yoko*3
  1152.     move.w    yoko(a6),d1
  1153.     move.w    d1,d0
  1154.     add.w    d1,d1
  1155.     add.w    d0,d1
  1156.  
  1157.     move.w    tate(a6),d2        *縦ループ数
  1158.     lsr.w    #1,d2
  1159.     subq.w    #1,d2
  1160.  
  1161.     move.w    yoko(a6),d4
  1162.     subq.w    #1,d4
  1163. hanten1:
  1164.     move.w    d4,d3
  1165.     movea.l    a2,a3
  1166. hanten2:
  1167.     move.b    (a0),d0
  1168.     move.b    (a3),(a0)+
  1169.     move.b    d0,(a3)+
  1170.     move.b    (a0),d0
  1171.     move.b    (a3),(a0)+
  1172.     move.b    d0,(a3)+
  1173.     move.b    (a0),d0
  1174.     move.b    (a3),(a0)+
  1175.     move.b    d0,(a3)+
  1176.     dbra.w    d3,hanten2
  1177.  
  1178.     suba.l    d1,a2
  1179.     dbra.w    d2,hanten1
  1180.     movem.l    (sp)+,d0-d4/a0-a3
  1181.     rts
  1182.  
  1183. *****************************************************************
  1184. *    24bit画像をコンバート                    *
  1185. *****************************************************************
  1186. bit24_conv:
  1187.     movem.l    d0-d3/d6-d7/a0-a3,-(sp)
  1188.     movea.w    line_byte1(a6),a3
  1189.     move.w    yoko(a6),d0        *横ループ
  1190.     subq.w    #1,d0
  1191.  
  1192. d_nashi:
  1193.     move.w    d0,d6
  1194.     movea.l    a0,a1
  1195. d_nashi1
  1196.     move.b    (a1)+,d1        *B
  1197.     move.b    (a1)+,d2        *G
  1198.     move.b    (a1)+,d3        *R
  1199.     move.b    d3,(a2)+
  1200.     move.b    d2,(a2)+
  1201.     move.b    d1,(a2)+
  1202.     dbra.w    d6,d_nashi1
  1203.  
  1204.     bsr    prt2            *変換ライン数表示
  1205.     suba.l    a3,a0
  1206.     dbra.w    d7,d_nashi
  1207.     movem.l    (sp)+,d0-d3/d6-d7/a0-a3
  1208.     rts
  1209.  
  1210. *****************************************************************
  1211. *    展開                            *
  1212. *****************************************************************
  1213. tenkai:
  1214.     cmp.w    #1,compress(a6)
  1215.     beq    tenkai8
  1216. tenkai4:
  1217.     bsr    rle4_tenkai
  1218.     bra    tenkai9
  1219. tenkai8:
  1220.     bsr    rle8_tenkai
  1221. tenkai9:
  1222.     rts
  1223.  
  1224. *****************************************************************
  1225. *    RLE4圧縮の展開                        *
  1226. *****************************************************************
  1227. rle4_tenkai:
  1228.     bsr    compress_read        *圧縮データ読み込む
  1229.  
  1230.     movea.l    a5,a0            *展開元
  1231.     movea.l    a5,a2            *展開元MAX
  1232.     adda.l    d6,a2
  1233.  
  1234.     movea.l    a2,a1            *展開先
  1235.  
  1236.     move.l    a1,d0            *万が一の展開先補正
  1237.     btst.l    #0,d0
  1238.     beq    rle4_tenkai_
  1239.     addq.l    #1,a1
  1240. rle4_tenkai_:
  1241.     movea.l    a1,a3            *取っておく
  1242.     movea.l    a1,a4
  1243.  
  1244.     moveq.l    #0,d2
  1245.     moveq.l    #0,d3
  1246.     moveq.l    #$f,d7
  1247.  
  1248. rle4_tenkai0:
  1249.     cmpa.l    a0,a2
  1250.     bls    rle4_tenkai9
  1251.  
  1252.     moveq.l    #0,d0
  1253.     move.b    (a0)+,d0
  1254.     beq    rle4_tenkai2
  1255.     move.b    (a0)+,d1
  1256.  
  1257.     subq.w    #1,d0
  1258. rle4_tenkai1:
  1259.     rol.b    #4,d1
  1260.     bsr    set
  1261.     dbra.w    d0,rle4_tenkai1
  1262.     bra    rle4_tenkai0
  1263.  
  1264. rle4_tenkai2:
  1265.     moveq.l    #0,d0
  1266.     move.b    (a0)+,d0
  1267.  
  1268.     cmp.b    #1,d0
  1269.     bcs    rle4_tenkai5
  1270.     beq    rle4_tenkai9
  1271. *    cmp.b    #2,d0            *無視
  1272. *    bne    rle4_tenkai2_
  1273. *    addq.l    #2,a0
  1274. *    bra    rle4_tenkai0
  1275.  
  1276. rle4_tenkai2_:
  1277.     btst.l    #0,d0            *偶数か
  1278.     bne    rle4_tenkai4        *違う
  1279.  
  1280. rle4_tenkai3:
  1281.     lsr.w    #1,d0
  1282.     subq.w    #1,d0
  1283.     move.w    d0,d5
  1284. rle4_tenkai3_:
  1285.     move.b    (a0)+,d1
  1286.     rol.b    #4,d1
  1287.     bsr    set
  1288.     rol.b    #4,d1
  1289.     bsr    set
  1290.     dbra.w    d0,rle4_tenkai3_
  1291.     btst.l    #0,d5
  1292.     bne    rle4_tenkai3__
  1293.     addq.l    #1,a0
  1294. rle4_tenkai3__:
  1295.     bra    rle4_tenkai0
  1296.  
  1297. rle4_tenkai4:
  1298.     cmp.w    #1,d0
  1299.     bne    rle4_tenkai4_
  1300.     move.b    (a0)+,d1
  1301.     rol.b    #4,d1
  1302.     bsr    set
  1303.     addq.l    #1,a0
  1304.     bra    rle4_tenkai0
  1305.  
  1306. rle4_tenkai4_:
  1307.     lsr.w    #1,d0
  1308.     subq.w    #1,d0
  1309.     move.w    d0,d5
  1310. rle4_tenkai4__:
  1311.     move.b    (a0)+,d1
  1312.     rol.b    #4,d1
  1313.     bsr    set
  1314.     rol.b    #4,d1
  1315.     bsr    set
  1316.     dbra.w    d0,rle4_tenkai4__
  1317.     move.b    (a0)+,d1
  1318.     rol.b    #4,d1
  1319.     bsr    set
  1320.     btst.l    #0,d5
  1321.     beq    rle4_tenkai4___
  1322.     addq.l    #1,a0
  1323. rle4_tenkai4___:
  1324.     bra    rle4_tenkai0
  1325.  
  1326. rle4_tenkai5:
  1327.     tst.w    d3
  1328.     beq    rle4_tenkai5_
  1329.     bsr    set
  1330. rle4_tenkai5_:
  1331.     adda.w    line_byte1(a6),a3    *展開アドレスの補正
  1332.     movea.l    a3,a1
  1333.     bra    rle4_tenkai0
  1334.  
  1335. rle4_tenkai9:
  1336.     tst.w    d3
  1337.     beq    rle4_tenkai9_
  1338.     bsr    set
  1339. rle4_tenkai9_:
  1340.     bsr    tenkai_move
  1341.     rts
  1342.  
  1343. set:
  1344.     move.w    d1,d4
  1345.     and.w    d7,d4
  1346.     rol.w    #4,d2
  1347.     or.w    d4,d2
  1348.     not.w    d3
  1349.     bne    set9
  1350.     move.b    d2,(a1)+
  1351.     moveq.l    #0,d2
  1352. set9:
  1353.     rts
  1354.  
  1355. *****************************************************************
  1356. *    RLE8圧縮の展開                        *
  1357. *****************************************************************
  1358. rle8_tenkai:
  1359.     bsr    compress_read        *圧縮データ読み込む
  1360.  
  1361.     movea.l    a5,a0            *展開元
  1362.     movea.l    a5,a2            *展開元MAX
  1363.     adda.l    d6,a2
  1364.  
  1365.     movea.l    a2,a1            *展開先
  1366.  
  1367.     move.l    a1,d0            *万が一の展開先補正
  1368.     btst.l    #0,d0
  1369.     beq    rle8_tenkai_
  1370.     addq.l    #1,a1
  1371. rle8_tenkai_:
  1372.     movea.l    a1,a3            *取っておく
  1373.     movea.l    a1,a4            *展開先スペア
  1374.  
  1375. rle8_tenkai0:
  1376.     cmpa.l    a0,a2
  1377.     bls    rle8_tenkai9
  1378.  
  1379.     moveq.l    #0,d0
  1380.     move.b    (a0)+,d0
  1381.     beq    rle8_tenkai2
  1382.     move.b    (a0)+,d1
  1383.  
  1384.     subq.w    #1,d0
  1385. rle8_tenkai1:
  1386.     move.b    d1,(a1)+
  1387.     dbra.w    d0,rle8_tenkai1
  1388.     bra    rle8_tenkai0
  1389.  
  1390. rle8_tenkai2:
  1391.     moveq.l    #0,d0
  1392.     move.b    (a0)+,d0
  1393.  
  1394.     cmp.b    #1,d0
  1395.     bcs    rle8_tenkai5
  1396.     beq    rle8_tenkai9
  1397. *    cmp.b    #2,d0            *無視
  1398. *    bne    rle8_tenkai2_
  1399. *    addq.l    #2,a0
  1400. *    bra    rle8_tenkai0_
  1401.  
  1402. rle8_tenkai2_:
  1403.     btst.l    #0,d0            *偶数か
  1404.     bne    rle8_tenkai4        *違う
  1405.  
  1406. rle8_tenkai3:
  1407.     subq.w    #1,d0
  1408. rle8_tenkai3_:
  1409.     move.b    (a0)+,(a1)+
  1410.     dbra.w    d0,rle8_tenkai3_
  1411.     bra    rle8_tenkai0
  1412.  
  1413. rle8_tenkai4:
  1414.     subq.w    #1,d0
  1415. rle8_tenkai4_:
  1416.     move.b    (a0)+,(a1)+
  1417.     dbra.w    d0,rle8_tenkai4_
  1418.     addq.l    #1,a0
  1419.     bra    rle8_tenkai0
  1420.  
  1421. rle8_tenkai5:
  1422.     adda.w    line_byte1(a6),a3    *展開アドレスの補正
  1423.     movea.l    a3,a1
  1424.     bra    rle8_tenkai0
  1425.  
  1426. rle8_tenkai9:
  1427.     bsr    tenkai_move
  1428.     rts
  1429.  
  1430.  
  1431. compress_read:
  1432.     move.w    #0,-(sp)        *シークモード
  1433.     move.l    offbits(a6),-(sp)    *オフセット
  1434.     move.w    in_file(a6),-(sp)
  1435.     DOS    _SEEK
  1436.     addq.l    #8,sp
  1437.     tst.l    d0
  1438.     bmi    read_err
  1439.  
  1440.     movea.l    buff_addr(a6),a5    *圧縮データを読み込む
  1441.     move.l    fi_size(a6),d6
  1442.     sub.l    offbits(a6),d6
  1443.     bsr    file_read
  1444.     rts
  1445.  
  1446.  
  1447. tenkai_move:
  1448.     move.w    line_byte1(a6),d0
  1449.     mulu.w    tate(a6),d0
  1450.     lsr.l    #2,d0
  1451. tenkai_move0:
  1452.     move.l    (a4)+,(a5)+
  1453.     subq.l    #1,d0
  1454.     bne    tenkai_move0
  1455.     rts
  1456.  
  1457. *****************************************************************
  1458. *    パレットデータの設定                    *
  1459. *****************************************************************
  1460. pal_set:
  1461.     cmp.w    #8,iro(a6)
  1462.     bls    pal_set0
  1463.     rts
  1464.  
  1465. pal_set0:
  1466.     movea.l    buff_addr(a6),a5    *パレットデータを読み込む
  1467.     adda.l    #14+64,a5
  1468.     move.l    offbits(a6),d6
  1469.     sub.l    #14+64,d6
  1470.     bmi    pal_set1
  1471.     bsr    file_read
  1472.  
  1473. pal_set1:
  1474.     cmp.w    #8,iro(a6)
  1475.     bcs    pal_set1_
  1476.  
  1477. pal_set1_:
  1478.     movea.l    pal_addr(a6),a0        *パレットの先頭アドレス
  1479.     lea.l    pal_buf(a6),a1        *パレットを設定するアドレス
  1480.  
  1481.     move.w    pal_cnt(a6),d0        *パレット数補正
  1482.     cmp.w    #256,d0
  1483.     bls    pal_set2
  1484.     move.w    #256,d0
  1485.  
  1486. pal_set2:
  1487.     subq.w    #1,d0
  1488.  
  1489.     cmp.w    #OS2v1,os_type(a6)
  1490.     bne    ps_win3
  1491.  
  1492. ps_os2v1:
  1493.     move.b    (a0)+,d1        *BGR
  1494.     move.b    (a0)+,d2
  1495.     move.b    (a0)+,d3
  1496.     move.b    d3,(a1)+        *RGB
  1497.     move.b    d2,(a1)+
  1498.     move.b    d1,(a1)+
  1499.     dbra.w    d0,ps_os2v1
  1500.     rts
  1501.  
  1502. ps_win3:
  1503.     move.b    (a0)+,d1        *BGR
  1504.     move.b    (a0)+,d2
  1505.     move.b    (a0)+,d3
  1506.     addq.l    #1,a0
  1507.     move.b    d3,(a1)+        *RGB
  1508.     move.b    d2,(a1)+
  1509.     move.b    d1,(a1)+
  1510.     dbra.w    d0,ps_win3
  1511.     rts
  1512.  
  1513. *****************************************************************
  1514. *    IPRファイルの作成                    *
  1515. *****************************************************************
  1516. ipr_set:
  1517.     bsr    ipr_name_set        *IPR名の作成
  1518.  
  1519.     lea.l    arg3(a6),a0        *IPRファイル作成
  1520.     bsr    file_create
  1521.  
  1522.     movea.l    buff_addr(a6),a0
  1523.     movea.l    a0,a5
  1524.  
  1525.     move.w    yoko(a6),d0        *横
  1526.     bsr    ipr_set9
  1527.     move.b    #SPACE,(a0)+
  1528.  
  1529.     move.w    tate(a6),d0        *縦
  1530.     bsr    ipr_set9
  1531.     move.b    #SPACE,(a0)+
  1532.  
  1533.     move.b    #'0',(a0)+
  1534.     move.b    #SPACE,(a0)+
  1535.     move.b    #'0',(a0)+
  1536.  
  1537.     sub.l    a5,a0
  1538.     move.l    a0,d6            *ヘッダ書き込み
  1539.     bsr    file_write
  1540.  
  1541.     move.w    out_file(a6),-(sp)    *ファイルCLOSE
  1542.     DOS    _CLOSE
  1543.     addq.l    #2,sp
  1544.     rts
  1545.  
  1546. ipr_set9:
  1547.     move.l    a0,-(sp)
  1548.     ext.l    d0
  1549.     lea.l    dec_buf(a6),a0
  1550.     bsr    bin2dec
  1551.     bsr    zero_keshi
  1552.     movea.l    a0,a1
  1553.     movea.l    (sp)+,a0
  1554.     bsr    strcpy
  1555.     rts
  1556.  
  1557. *****************************************************************
  1558. *    IPR名の作成                        *
  1559. *****************************************************************
  1560. ipr_name_set:
  1561.     lea.l    arg2(a6),a1        *転送元
  1562.     lea.l    arg3(a6),a0        *転送先
  1563.     bsr    strcpy            *ファイル名を複写する
  1564.  
  1565.     lea.l    arg3(a6),a0
  1566.     lea.l    cext1(pc),a1
  1567.     bsr    cheng_ext
  1568.     rts
  1569.  
  1570. *****************************************************************
  1571. *    セーブ名の作成                        *
  1572. *****************************************************************
  1573. save_name_set:
  1574.     lea.l    filbuf(a6),a1        *転送元
  1575.     lea.l    30(a1),a1
  1576.     movea.l    nameichi(a6),a0        *転送先
  1577.     bsr    strcpy            *ファイル名を複写する
  1578.  
  1579.     lea.l    arg2(a6),a0
  1580.     lea.l    cext2(pc),a1
  1581.     bsr    cheng_ext
  1582.     rts
  1583.  
  1584. *****************************************************************
  1585. *    拡張子を変更する                    *
  1586. *****************************************************************
  1587. cheng_ext:
  1588. *    lea.l    arg2(a6),a0        *ファイル名のアドレス
  1589. *    lea.l    cext(pc),a1
  1590. cheng_ext0:
  1591.     cmp.b    #".",(a0)+        *拡張子があるか
  1592.     bne    cheng_ext0
  1593.     subq.l    #1,a0            *行きすぎたから1つ戻る
  1594. cheng_ext1:
  1595.     move.b    (a1)+,(a0)+        *1文字転送
  1596.     bne    cheng_ext1        *終了コードまで繰り返す
  1597. cheng_ext2:
  1598.     rts
  1599.  
  1600. *****************************************************************
  1601. *    表示関係                        *
  1602. *****************************************************************
  1603. prt0:                    *表示バッファ初期化
  1604.     movem.l    d0/a0,-(sp)
  1605.     lea.l    prt_buff(a6),a0
  1606.     moveq.l    #96-1,d0
  1607. prt0_:
  1608.     move.b    #SPACE,(a0)+
  1609.     dbra.w    d0,prt0_
  1610.     clr.b    (a0)+
  1611.     movem.l    (sp)+,d0/a0
  1612.     rts
  1613.  
  1614.  
  1615. prt1:                    *ファイル名とサイズ表示
  1616.     movem.l    d0/a0-a1,-(sp)
  1617.  
  1618.     lea.l    prt_buff(a6),a0
  1619.     lea.l    filbuf(a6),a1
  1620.     lea.l    30(a1),a1
  1621.     bsr    strcpy
  1622.     move.b    #SPACE,(a0)
  1623.  
  1624.     lea.l    prt_buff(a6),a0        *位置合わせ
  1625.     adda.l    #22,a0
  1626.  
  1627.     move.b    #"(",(a0)+        *画像サイズ
  1628.     move.w    yoko(a6),d0
  1629.     bsr    dec_set
  1630.     move.b    #",",(a0)+
  1631.     move.w    tate(a6),d0
  1632.     bsr    dec_set
  1633.     move.b    #")",(a0)+
  1634.  
  1635.     move.w    iro(a6),d0        *bit数
  1636.     bsr    dec_set
  1637.     lea.l    bit_mes(pc),a1
  1638.     bsr    strcpy
  1639.  
  1640.     lea.l    crlf_mes(pc),a1
  1641.     bsr    strcpy
  1642.     lea.l    prt_buff(a6),a0
  1643.     bsr    mesput
  1644.     movem.l    (sp)+,d0/a0-a1
  1645.     rts
  1646.  
  1647.  
  1648. prt2:                    *変換ライン数表示
  1649.     movem.l    d0-d1/a0-a1,-(sp)
  1650.  
  1651.     lea.l    prt_buff(a6),a0
  1652.  
  1653.     addq.w    #1,line_cnt(a6)
  1654.     move.w    line_cnt(a6),d0
  1655.     bsr    dec_set
  1656.     move.b    #"/",(a0)+
  1657.     move.w    tate(a6),d0
  1658.     bsr    dec_set
  1659.  
  1660.     lea.l    henkan_mes(pc),a1
  1661.     bsr    strcpy
  1662.     lea.l    crlf_mes(pc),a1
  1663.     bsr    strcpy
  1664.  
  1665.     IOCS    _B_UP_S
  1666.     moveq.l    #42,d1
  1667.     IOCS    _B_RIGHT
  1668.     lea.l    prt_buff(a6),a0
  1669.     bsr    mesput
  1670.     movem.l    (sp)+,d0-d1/a0-a1
  1671.     rts
  1672.  
  1673.  
  1674. prt3:                    *'終了!'表示
  1675.     movem.l    d0-d1/a0-a1,-(sp)
  1676.     lea.l    prt_buff(a6),a0
  1677.     lea.l    syuryo_mes(pc),a1
  1678.     bsr    strcpy
  1679.     lea.l    crlf_mes(pc),a1
  1680.     bsr    strcpy
  1681.  
  1682.     IOCS    _B_UP_S
  1683.     moveq.l    #51,d1
  1684.     IOCS    _B_RIGHT
  1685.     lea.l    prt_buff(a6),a0
  1686.     bsr    mesput
  1687.     movem.l    (sp)+,d0-d1/a0-a1
  1688.     rts
  1689.  
  1690.  
  1691. dec_set
  1692.     move.l    a0,-(sp)
  1693.     ext.l    d0
  1694.     lea.l    dec_buf(a6),a0
  1695.     bsr    bin2dec
  1696.     bsr    zero_keshi
  1697.     move.l    (sp)+,a0
  1698.     lea.l    dec_buf(a6),a1
  1699.     addq.l    #6,a1
  1700.     bsr    strcpy
  1701.     rts
  1702.  
  1703. *****************************************************************
  1704. *    2進=>10進                        *
  1705. *    d0 変換元の数値 a0 変換後の格納アドレス            *
  1706. *****************************************************************
  1707. bin2dec:
  1708.     movem.l    d0-d3/a0-a1,-(sp)
  1709.     moveq.l    #10-1,d1
  1710.     lea.l    exp_tbl(pc),a1
  1711. bin2dec0:
  1712.     clr.b    d2
  1713.     move.l    (a1)+,d3
  1714. bin2dec1:
  1715.     or    d3,d3
  1716.     sub.l    d3,d0
  1717.     bcs    bin2dec2
  1718.     addq.b    #1,d2
  1719.     bra    bin2dec1
  1720. bin2dec2:
  1721.     add.l    d3,d0
  1722.     add.b    #'0',d2
  1723.     move.b    d2,(a0)+
  1724.     dbra    d1,bin2dec0
  1725.     movem.l    (sp)+,d0-d3/a0-a1
  1726.     rts
  1727.  
  1728. exp_tbl:
  1729.     .dc.l    1000000000
  1730.     .dc.l    100000000
  1731.     .dc.l    10000000
  1732.     .dc.l    1000000
  1733.     .dc.l    100000
  1734.     .dc.l    10000
  1735.     .dc.l    1000
  1736.     .dc.l    100
  1737.     .dc.l    10
  1738.     .dc.l    1
  1739.  
  1740. *****************************************************************
  1741. *    ファイルサイズの頭にある'0'を消す            *
  1742. *****************************************************************
  1743. zero_keshi:
  1744.     lea.l    dec_buf(a6),a0
  1745.     moveq.l    #9-1,d0
  1746. zero_keshi0:
  1747.     cmp.b    #'0',(a0)
  1748.     bne    zero_keshi9
  1749.     move.b    #SPACE,(a0)+
  1750.     dbra.w    d0,zero_keshi0
  1751. zero_keshi9:
  1752.     rts
  1753.  
  1754. *****************************************************************
  1755. *    ファイルのOPENを行う                *
  1756. *****************************************************************
  1757. file_open:
  1758.     move.w    #0,-(sp)        *ファイルopen
  1759.     move.l    a0,-(sp)
  1760.     DOS    _OPEN
  1761.     addq.l    #6,sp
  1762.     tst.l    d0
  1763.     bmi    open_err
  1764.     move.w    d0,in_file(a6)
  1765.     rts
  1766.  
  1767. *****************************************************************
  1768. *    ファイルのサイズを求める(d6に返す)            *
  1769. *****************************************************************
  1770. file_size:
  1771.     move.w    #2,-(sp)
  1772.     move.l    #0,-(sp)
  1773.     move.w    in_file(a6),-(sp)
  1774.     DOS    _SEEK
  1775.     addq.l    #8,sp
  1776.     tst.l    d0            *OK?
  1777.     bmi    read_err
  1778.  
  1779.     move.l    d0,d6
  1780.  
  1781.     move.w    #0,-(sp)
  1782.     move.l    #0,-(sp)
  1783.     move.w    in_file(a6),-(sp)
  1784.     DOS    _SEEK
  1785.     addq.l    #8,sp
  1786.     tst.l    d0            *OK?
  1787.     bmi    read_err
  1788.     rts
  1789.  
  1790. *****************************************************************
  1791. *    ディスクからデータの読み込みを行う            *
  1792. *****************************************************************
  1793. file_read:
  1794.     move.l    d6,-(sp)        *データサイズ
  1795.     move.l    a5,-(sp)        *バッファアドレス
  1796.     move.w    in_file(a6),-(sp)
  1797.     DOS    _READ
  1798.     lea    10(sp),sp
  1799.     tst.l    d0
  1800.     bmi    read_err
  1801.     cmp.l    d6,d0
  1802.     bne    read_err
  1803.     rts
  1804.  
  1805. *****************************************************************
  1806. *    ファイル作成                        *
  1807. *****************************************************************
  1808. file_create:
  1809.     move.w    #$20,-(sp)        *ファイルCREATE
  1810.     move.l    a0,-(sp)
  1811.     DOS    _CREATE
  1812.     addq.l    #6,sp
  1813.  
  1814.     tst.l    d0
  1815.     bmi    create_err
  1816.     move.w    d0,out_file(a6)
  1817.     rts
  1818.  
  1819. *****************************************************************
  1820. *    ディスクに書き込む                    *
  1821. *****************************************************************
  1822. file_write:
  1823.     move.l    d6,-(sp)        *データサイズ
  1824.     move.l    a5,-(sp)        *バッファアドレス
  1825.     move.w    out_file(a6),-(sp)
  1826.     DOS    _WRITE
  1827.     lea.l    10(sp),sp
  1828.     tst.l    d0
  1829.     bmi    write_err
  1830.     cmp.l    d6,d0
  1831.     bne    write_err
  1832.     rts
  1833.  
  1834. *****************************************************************
  1835. *    バッファ確保                        *
  1836. *****************************************************************
  1837. buf_get:
  1838.     pea.l    -1.w            *確保出来る最大サイズを取得
  1839.     DOS    _MALLOC
  1840.     addq.l    #4,sp
  1841.     andi.l    #$00ffffff,d0
  1842.     move.l    d0,d1
  1843.     move.l    d0,-(sp)
  1844.     DOS    _MALLOC
  1845.     addq.l    #4,sp
  1846.     tst.l    d0
  1847.     bmi    no_buff
  1848.  
  1849.     move.l    d0,buff_addr(a6)    *バッファアドレス
  1850.     move.l    d1,buff_size(a6)    *バッファサイズ
  1851.     rts
  1852.  
  1853. *****************************************************************
  1854. *    ファイルクローズ                    *
  1855. *****************************************************************
  1856. file_close1:
  1857.     move.w    in_file(a6),-(sp)
  1858.     DOS    _CLOSE
  1859.     addq.l    #2,sp
  1860.     rts
  1861.  
  1862. file_close2:
  1863.     move.w    out_file(a6),-(sp)
  1864.     DOS    _CLOSE
  1865.     addq.l    #2,sp
  1866.     rts
  1867.  
  1868. *****************************************************************
  1869. *    バッファ開放                        *
  1870. *****************************************************************
  1871. buf_free:
  1872.     pea.l    buff_addr(a6)        *バッファ開放
  1873.     DOS    _MFREE
  1874.     addq.l    #4,sp
  1875.     rts
  1876.  
  1877. *****************************************************************
  1878. *    処理したファイル数をチェックする            *
  1879. *****************************************************************
  1880. file_cnt_chk:
  1881.     tst.w    file_cnt(a6)        *処理したファイルは0個か
  1882.     bne    file_cnt_chk1        *違う
  1883.     lea.l    no_file_mes(pc),a0
  1884.     bsr    mesput
  1885. file_cnt_chk1:
  1886.     rts
  1887.  
  1888. *****************************************************************
  1889. *    サポートしていないBMP                    *
  1890. *****************************************************************
  1891. no_support_err:
  1892.     lea.l    arg1(a6),a0
  1893.     bsr    mesput
  1894.     lea.l    no_support_mes(pc),a0
  1895.     bsr    mesput
  1896.     rts
  1897.  
  1898. *****************************************************************
  1899. *    色違い                            *
  1900. *****************************************************************
  1901. but_col_err:
  1902.     lea.l    arg1(a6),a0
  1903.     bsr    mesput
  1904.     lea.l    but_col_mes(pc),a0
  1905.     bsr    mesput
  1906.     rts
  1907.  
  1908. *****************************************************************
  1909. *    メモリが足りない                    *
  1910. *****************************************************************
  1911. no_buff:
  1912.     lea.l    arg1(a6),a0
  1913.     bsr    mesput
  1914.     lea.l    no_buff_mes(pc),a0
  1915.     bsr    mesput
  1916.     rts
  1917.  
  1918. *****************************************************************
  1919. *    ファイル名エラー                    *
  1920. *****************************************************************
  1921. name_er:
  1922.     lea.l    in_mes(pc),a0
  1923.     bsr    mesput
  1924.     lea.l    name_er_mes(pc),a0
  1925.     bsr    mesput
  1926.     bra    exit2
  1927.  
  1928. *****************************************************************
  1929. *    ファイルエラー                        *
  1930. *****************************************************************
  1931. file_er:
  1932.     move.w    in_file(pc),-(sp)    *ファイルCLOSE
  1933.     DOS    _CLOSE
  1934.     addq.l    #2,sp
  1935.  
  1936.     lea.l    arg1(a6),a0
  1937.     bsr    mesput
  1938.     lea.l    file_er_mes(pc),a0
  1939.     bsr    mesput
  1940.     bra    exit2
  1941.  
  1942. *****************************************************************
  1943. *    ファイルが見付からない                    *
  1944. *****************************************************************
  1945. open_err:
  1946.     lea.l    arg1(a6),a0
  1947.     bsr    mesput
  1948.     lea.l    open_er_mes(pc),a0
  1949.     bsr    mesput
  1950.     bra    exit2
  1951.  
  1952. *****************************************************************
  1953. *    読み込みエラー                        *
  1954. *****************************************************************
  1955. read_err:
  1956.     lea.l    arg1(a6),a0
  1957.     bsr    mesput
  1958.     lea.l    read_er_mes(pc),a0
  1959.     bsr    mesput
  1960.     bra    exit2
  1961.  
  1962. *****************************************************************
  1963. *    出力パス名エラー                    *
  1964. *****************************************************************
  1965. out_name_err:
  1966.     lea.l    out_mes(pc),a0
  1967.     bsr    mesput
  1968.     lea.l    name_er_mes(pc),a0
  1969.     bsr    mesput
  1970.     bra    exit2
  1971.  
  1972. *****************************************************************
  1973. *    ファイル作成エラー                    *
  1974. *****************************************************************
  1975. create_err:
  1976.     lea.l    arg2(a6),a0
  1977.     bsr    mesput
  1978.     lea.l    create_er_mes(pc),a0
  1979.     bsr    mesput
  1980.     bra    exit2
  1981.  
  1982. *****************************************************************
  1983. *    ファイル書き込みエラー                    *
  1984. *****************************************************************
  1985. write_err:
  1986.     lea.l    arg2(a6),a0
  1987.     bsr    mesput
  1988.     lea.l    write_er_mes(pc),a0
  1989.     bsr    mesput
  1990.     bra    exit2
  1991.  
  1992. *****************************************************************
  1993. *    使用方表示                        *
  1994. *****************************************************************
  1995. usage:
  1996.     lea.l    usage_mes(pc),a0
  1997.     bsr    mesput
  1998.     bra    exit2
  1999.  
  2000. *****************************************************************
  2001. *    メッセージ表示                        *
  2002. *****************************************************************
  2003. mesput:
  2004. *    move.w    #STDERR,-(sp)        *標準エラー出力へ
  2005.     move.w    #STDOUT,-(sp)        *標準出力へ
  2006.     move.l    a0,-(sp)        *メッセージを
  2007.     DOS    _FPUTS            *出力する
  2008.     addq.l    #6,sp            *スタック補正
  2009.     rts
  2010.  
  2011. *****************************************************************
  2012. *    終了処理                        *
  2013. *****************************************************************
  2014. exit:
  2015.     IOCS    _MS_INIT        *キーバッファクリア
  2016.     moveq.l    #-1,d1
  2017.     IOCS    _SKEY_MOD
  2018.     move.w    #-1,-(sp)
  2019.     DOS    _KFLUSH
  2020.     addq.l    #2,sp
  2021.     rts
  2022.  
  2023. *****************************************************************
  2024. *    エラー処理2                        *
  2025. *****************************************************************
  2026. exit2:
  2027.     bsr    exit
  2028.     move.w    #1,-(sp)        *終了コード1を持って
  2029.     DOS    _EXIT2            * エラー終了
  2030.  
  2031. *****************************************************************
  2032. *    データエリア                        *
  2033. *****************************************************************
  2034.     .data
  2035.     .even
  2036. usage_mes:
  2037.     .dc.b    'BMP to RGB converter V0.01 by A.MUKAWA',CR,LF
  2038.     .dc.b    '機能:Win標準BMPファイルを 24bitベタのRGBファイルにコンバートします',CR,LF
  2039.     .dc.b    '用法:BMP2RGB [スイッチ] ファイル名 [セーブ先パス]',CR,LF
  2040.     .dc.b    CR,LF
  2041.     .dc.b    '               /H        識別ヘッダ"BM"をチェックしない',CR,LF
  2042.     .dc.b    '               /N        上下逆に表示される謎の16bitBMPのときに指定',CR,LF
  2043.     .dc.b    0
  2044.  
  2045. in_mes:
  2046.     .dc.b    '入力ファイル',0
  2047. out_mes:
  2048.     .dc.b    '出力先パス',0
  2049. name_er_mes:
  2050.     .dc.b    '名の指定に間違いがあります!',CR,LF,0
  2051. file_er_mes:
  2052.     .dc.b    ' はBMPファイルではないようです!',CR,LF,0
  2053. but_col_mes:
  2054.     .dc.b    ' は未サポートの色数です!',CR,LF,0
  2055. no_support_mes:
  2056.     .dc.b    ' はサポートしていないBMPフォーマットです!',CR,LF,0
  2057. open_er_mes:
  2058.     .dc.b    ' が見つかりません!',CR,LF,0
  2059. read_er_mes:
  2060.     .dc.b    ' の読み込みエラーが発生しました!',CR,LF,0
  2061. no_buff_mes:
  2062.     .dc.b    ' の変換に必要なメモリがありません!',CR,LF,0
  2063. create_er_mes:
  2064.     .dc.b    ' が作れません!',CR,LF,0
  2065. write_er_mes:
  2066.     .dc.b    ' の書き込みエラーが発生しました!',CR,LF,0
  2067. no_file_mes:
  2068.     .dc.b    '変換できるファイルがありませんでした!',CR,LF,0
  2069. henkan_mes:
  2070.     .dc.b    ' 変換中',0
  2071. syuryo_mes:
  2072.     .dc.b    ' 終了!',0
  2073. bit_mes:
  2074.     .dc.b    'bit',0
  2075. crlf_mes:
  2076.     .dc.b    CR,LF,0
  2077. func_off_mes:
  2078.     .dc.b    $1b,$5b,$3e,$31,$68,0
  2079. sla_mes:
  2080.     .dc.b    '/',0
  2081.  
  2082. dext:
  2083.     .dc.b    '.BMP',0        *補う拡張子
  2084. komekome:
  2085.     .dc.b    '\'
  2086. kome0:
  2087.     .dc.b    '*.BMP',0
  2088. cext1:
  2089.     .dc.b    '.IPR',0        *変更する拡張子
  2090. cext2:
  2091.     .dc.b    '.RGB',0        *変更する拡張子
  2092.  
  2093. *****************************************************************
  2094. *    ワークエリア                        *
  2095. *****************************************************************
  2096.  
  2097.     .offset    0
  2098. pal_buf:
  2099.     .ds.b    256*3
  2100. filbuf:
  2101.     .ds.b    53            *ファイル情報格納バッファ
  2102. nambuf:
  2103.     .ds.b    92            *ファイル名展開用バッファ
  2104. arg1:
  2105.     .ds.b    256            *入力ファイル名バッファ
  2106. arg2:
  2107.     .ds.b    256            *出力ファイル名バッファ
  2108. arg3:
  2109.     .ds.b    256            *IPRファイル名バッファ
  2110. cpathbuf
  2111.     .ds.b    65            *カレントパス名バッファ
  2112. spathbuf
  2113.     .ds.b    65            *セーブ先パス名バッファ
  2114.     .even
  2115. buff_addr:
  2116.     .ds.l    1            *画像読み込みバッファアドレス
  2117. buff_size:
  2118.     .ds.l    1            *画像読み込みバッファサイズ
  2119. gr_addr:
  2120.     .ds.l    1            *画像データアドレス
  2121. fi_size:
  2122.     .ds.l    1            *ファイルサイズ
  2123. offbits:
  2124.     .ds.l    1            *画像データ迄のオフセット
  2125. pal_addr:
  2126.     .ds.l    1            *パレットアドレス
  2127. os_type:
  2128.     .ds.w    1            *OSのタイプ
  2129. pal_cnt:
  2130.     .ds.w    1            *パレット数
  2131. iro:
  2132.     .ds.w    1            *使用色数(BIT)
  2133. compress:
  2134.     .ds.w    1            *圧縮モード
  2135. yoko:
  2136.     .ds.w    1            *画像の横(X)サイズ
  2137. tate:
  2138.     .ds.w    1            *画像の縦(Y)サイズ
  2139. line_byte1:
  2140.     .ds.w    1            *1ラインのバイト数(読み込み側)
  2141. line_byte2:
  2142.     .ds.w    1            *1ラインのバイト数(書き込み側)
  2143. line_cnt:
  2144.     .ds.w    1
  2145. file_cnt:
  2146.     .ds.w    1
  2147. nameichi:
  2148.     .ds.l    1
  2149. in_file:
  2150.     .ds.w    1
  2151. out_file:
  2152.     .ds.w    1
  2153. dec_buf:
  2154.     .ds.b    10+1
  2155. prt_buff:
  2156.     .ds.b    96+1
  2157. dflg:
  2158.     .dc.b    1
  2159. nflg:
  2160.     .dc.b    1
  2161. hflg:
  2162.     .dc.b    1
  2163. skip_flg:
  2164.     .dc.b    1
  2165.     .even
  2166. WORK_SIZE:
  2167.  
  2168.     .bss
  2169.     .even
  2170. work:
  2171.     .ds.b    WORK_SIZE
  2172. my_stack:
  2173.     .ds.l    1024
  2174. mysp:
  2175.     .end    start
  2176.